import { aesEncrypt, aesDecrypt } from "./cryptor";

/**
 * 状态数据接口
 */
interface StateData {
  /** 时间戳 */
  timestamp: number;
  /** 随机字符串 */
  nonce: string;
}

/**
 * OAuth状态管理工具类
 * 用于生成和验证OAuth流程中的state参数
 */
export class StateManager {
  /** 状态参数过期时间（5分钟） */
  private static EXPIRY_TIME = 5 * 60 * 1000;

  /**
   * 生成一个新的state参数
   * @param secret 用于加密的密钥
   * @returns 生成的state字符串
   */
  static async generate(secret: string): Promise<string> {
    // 创建状态数据
    const stateData: StateData = {
      timestamp: Date.now(),
      nonce: crypto.randomUUID()
    };

    // 将状态数据转换为JSON并加密
    const plaintext = JSON.stringify(stateData);
    return await aesEncrypt(plaintext, secret);
  }

  /**
   * 验证state参数
   * @param state 要验证的state参数
   * @param secret 用于验证的密钥
   * @returns 验证是否通过
   */
  static async validate(state: string, secret: string): Promise<boolean> {
    try {
      // 解密state
      const decrypted = await aesDecrypt(state, secret);
      const stateData = JSON.parse(decrypted) as StateData;

      // 验证时间戳是否在有效期内
      const now = Date.now();
      const isValid = (now - stateData.timestamp) <= StateManager.EXPIRY_TIME;

      return isValid;
    } catch (error) {
      console.error('State validation error:', error);
      return false;
    }
  }
}